#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
from os import sep # Separador de arquivos
from os import getcwd  # função para saber o nome da pasta que o arquivo se encontra
import cliente as client # Importando o módulo cliente pelo com o alias client


try:
    import pygtk
    pygtk.require('2.0')
except:
    pass                # Libs da biblioteca gráfica
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)

CENTER = gtk.WIN_POS_CENTER
BRANCO = '-1'

class Urna(object):
    
    def __init__(self):
        print 'gui:'+getcwd()+sep+'arquivos'+sep+'gui.glade'
        
        
        
        self.xml = gtk.glade.XML(getcwd()+sep+'arquivos'+sep+'gui.glade') # Carregar xml glade
        
        # Loading widgets
        #Janela 1
        self.window1 = self.xml.get_widget('window1') #Todo Nomear janela
        
        self.btnClean = self.xml.get_widget('btnClean')
        self.entryCpf = self.xml.get_widget('entryCpf')
        self.btnCancel = self.xml.get_widget('btnCancel')
        self.btnStart = self.xml.get_widget('btnStart')
        self.status = self.xml.get_widget('status')
        self.win1_vbox2 = self.xml.get_widget('vbox12')
        self.win1_vbox3 = self.xml.get_widget('vbox13')
        self.win1_vbox4 = self.xml.get_widget('vbox14')
        self.btnZero = self.xml.get_widget('btnZero')
        self.table = self.xml.get_widget('table1')
        
        
        #Janela 2
        self.window2 = self.xml.get_widget('window2')
        self.btnZero2 = self.xml.get_widget('btnZero2')
        self.win2_vbox2 = self.xml.get_widget('vbox22')
        self.win2_vbox3 = self.xml.get_widget('vbox23')
        self.win2_vbox4 = self.xml.get_widget('vbox24')
        self.lbpparty = self.xml.get_widget('lbpparty') # Political party
        self.lbName = self.xml.get_widget('lbName')
        self.lbNumber = self.xml.get_widget('lbNumber')
        self.lbEmployment = self.xml.get_widget('lbEmployment')
        self.btnCorrect = self.xml.get_widget('btnCorrect')
        self.btnOk = self.xml.get_widget('btnOk')
        self.btnWhite = self.xml.get_widget('btnWhite')
        self.image = self.xml.get_widget('profile')
        
        #Dialog
        self.dialog = self.xml.get_widget('dialog1')
        self.btnYes = self.xml.get_widget('btnYes')
        self.btnNo = self.xml.get_widget('btnNo')
        self.lbDialog = self.xml.get_widget('lbDialogName')

        #windowIP
        self.windowIP = self.xml.get_widget('windowIP')
        self.btnIPOk = self.xml.get_widget('btnIPOk')
        self.btnIPCancel = self.xml.get_widget('btnIPCancel')
        self.txtIPValue = self.xml.get_widget('txtIPValue')
        self.txtGateValue = self.xml.get_widget('txtGateValue')
        self.ipStatus = self.xml.get_widget('ipStatus')

        
        keyboard= [['1','4','7'],['2','5','8',],['3','6','9']]
        
        containers = [
                        (self.win1_vbox2,self.win2_vbox2),
                        (self.win1_vbox3,self.win2_vbox3),
                        (self.win1_vbox4,self.win2_vbox4),
                     ]
                        
        #Callbaks
        for position,vboxs in enumerate(containers):
            flag=True
            for vbox in vboxs:
                if flag:
                    callback,output = (self.device_keyboard_callback,self.entryCpf)
                else:
                    callback,output = (self.urna_keyboard_callback,self.lbNumber)
                for number in keyboard[position]:
                    btn = gtk.Button(label=number)
                    vbox.pack_start(btn)
                    btn.connect('clicked',callback,number,output)
                flag = False
                
        self.btnWhite.connect('clicked',self.btn_white_callback)
        self.btnZero2.connect('clicked',self.urna_keyboard_callback,'0',self.lbNumber)
        self.btnZero.connect('clicked',self.device_keyboard_callback,'0',self.entryCpf) # Callback do botao zero
        self.btnClean.connect('clicked',self.btn_clean_callback,self.entryCpf)
        self.btnStart.connect('clicked',self.btn_start_callback)
        self.btnCancel.connect('clicked',gtk.main_quit)
        self.btnCorrect.connect('clicked',self.btn_correct_callback )                                     
        self.btnOk.connect('clicked',self.btn_ok_callback)
        
        self.btnYes.connect('clicked',self.vote_callback)
        
        self.btnNo.connect('clicked',self.delete_dialog_callback)
        self.dialog.connect('delete_event',self.delete_dialog_callback)

        self.btnIPOk.connect('clicked', self.btnIPOk_callback, self.txtIPValue, self.txtGateValue)
        self.btnIPCancel.connect('clicked', gtk.main_quit)
        
        #Configuration
        self.conf_window(window=self.window1,title='Urna',size=(250,300),rezisable=False)
        self.conf_window(window=self.window2,title='Urna',size=(800,480),rezisable=False)
        self.conf_window(window=self.windowIP, title='Conexão', size=(200,150), rezisable=False)
        self.windowIP.show_all() # Show widget
        self.dialog.set_title('PyUrna')
    
    
    #window1
    
    def btn_clean_callback(self,widget,output):
        text = output.get_text()
        if len(text)>0:
            output.set_text(text[:-1])
            self.status.pop(0) # Retirar msg do status
        
    def device_keyboard_callback(self,widget,data,output):
        """
        Primeira janela de confirmação do CPF
        """
        text = output.get_text()
        print data
        if len(text)<11:
            text+=data # Colocar os pontos
            output.set_text(text)
            
    def btn_start_callback(self,widget):
        """
        Callback do botão OK da janela do cpf
        """
        
        self.status.pop(0) #Retirar msg do status
        
        cpf = self.entryCpf.get_text() # Pegar cpf na caixa de texto 
        if len(cpf)==11:
            
            #self.cliente = client.Cliente('localhost',2727) # cria o cliente
        
            try:
                
                cargo=self.cliente.autenticar(cpf) # Autenticar o usuário
                self.lbEmployment.set_markup('<big><b>'+cargo+'</b></big>') # Mudar o cargo da eleição
                
                self.window1.hide() 
                self.window2.show_all()
                
            except Exception,e:
                self.status.push(0,e.args[0]) #Inserir informação de erro
                                            #na barra de status
        
        else:
            self.status.push(0,'CPF Inválido')
            
    
    #window2
    
    def btn_correct_callback(self,widget):
        """
        Corrigir as informações na urna
        """
        
        self.lbpparty.set_text('')
        self.lbNumber.set_text('')
        self.lbName.set_text('')
        self.image.set_from_file(client.IMAGEM_DEFAULT)
        
    def urna_keyboard_callback(self,widget,number,output=None):
        """Atualiza o label que contem o numero do candidato"""
        
        text=output.get_text()
        TAM=2
        if len(text)<TAM:           
            text+=number
            size = len(text)
            text='<big><b>'+text+'</b></big>'
            output.set_markup(text)
            
            if size==TAM:
                
                try:
                    numero = self.lbNumber.get_text() #Numero na Urna
                    partido = self.cliente.partido_politico(numero)
                    self.lbpparty.set_text(partido) # Mudar o partido
                    candidato = self.cliente.nome_cadidato(numero) # Pegar o nome do candidato
                    self.lbName.set_markup('<big><b>'+candidato+'</b></big>')
                    
                    imagem = self.cliente.imagem(numero)
                    self.image.set_from_file(imagem)
                    
                except:
                    print 'Nulo'
    
    def btn_white_callback(self,widget):
        self.lbNumber.set_text('')
        self.vote_callback(widget)
        
        
                    
    def btn_ok_callback(self,widget,data=None):
        """
        Dialog de confirmação do voto
        """
        self.dialog.set_position(CENTER)
        nome = self.lbName.get_text()
        if not nome:
            nome="Nulo"
        self.lbDialog.set_markup('<big><b>'+nome+'</b></big>')
        
        self.dialog.show_all()
        self.window2.set_sensitive(False)
 
    #dialog

    def delete_dialog_callback(self,widget):
        """
        Fechar o Dialog
        """
        self.window2.set_sensitive(True)
        self.dialog.hide()
    
    
    

    def vote_callback(self,widget):
        """
        Callback do botão de votar
        """
        self.dialog.hide()  
        self.window2.set_sensitive(True)
        self.hbox21 = self.xml.get_widget('hbox21') 
        self.hbox21.destroy() # Excluir o container da segunda tela
        self.vbox31 = self.xml.get_widget('vbox31') # Carregar e inserir o container que contem
        self.window2.add(self.vbox31) # que contem o label escrito FIM 
        self.vbox31.show()
        
        try:
            voto = self.lbNumber.get_text()
            if not voto:
                voto=BRANCO
            self.cliente.votar(voto)
        except:
                #DESTRUIR E MOSTRAR MENSAGEM DE ERRO
                print 'Erro na votação'

    #windowIP
    def btnIPOk_callback(self, widget, ipValue, gateValue):
        """
        Iniciar conexão com o servidor através do ip e porta escolhidos
        """
        self.ipStatus.pop(0) #Retirar msg do status

        gate = gateValue.get_text()

        if gate.isdigit():
        
            self.cliente = client.Cliente(ipValue.get_text(),int(gateValue.get_text())) # cria o cliente
                    
            try:
                            
                self.cliente.tenta_conectar() # Tenta conectar
                
                self.windowIP.hide() 
                self.window1.show_all()
                            
            except Exception,e:
                self.ipStatus.push(0,e.args[0]) #Inserir informação de erro na barra de status

        else:
            self.ipStatus.push(0, 'Porta deve ser número.')


    def conf_window(self,window,position=CENTER,title=None,size=(-1,-1),rezisable=True):
        """Configurar as janelas da interface"""
        window.set_size_request(*size)
        window.set_position(position)
        window.set_resizable(rezisable)
        window.connect('delete_event',gtk.main_quit)
        if title:
            window.set_title(title)
            
        
    def main(self):
        gtk.main()

if __name__ == "__main__":
    Urna().main()
    
        
